18714
18211
Έχω μια λίστα με φορές σε δευτερόλεπτα όπως:
L = [0.10218048, 1.20851996, 1.46800021, 1.73429061, 2.71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8,83068894, 10,07690977, 11,53867284, 12,01214112, 12,133,7653
Για κάθε παράθυρο μήκους 2 δευτερολέπτων ξεκινώντας από ένα δεύτερο όριο, θα ήθελα να εξάγω μια λίστα όλων των χρόνων που εμπίπτουν στο παράθυρο των 2 δευτερολέπτων. Έτσι, για το παραπάνω παράδειγμα θα ήταν:
[0.10218048, 1.20851996, 1.46800021, 1.73429061]
[1.20851996, 1.46800021, 1.73429061, 2.71525848]
[2.71525848, 3.14781922, 3.63637958]
[3.14781922, 3.63637958]
[5.11147358, 5.97497864]
[5.11147358, 5.97497864, 6.35469013, 6.80623747, 6.99571917]
[6.35469013, 6.80623747, 6.99571917, 7.65215123, 7.86108352]
[7.65215123, 7.86108352, 8.52988247, 8.83068894]
[8.52988247, 8.83068894]
[10.07690977]
[10.07690977, 11.5386728]
[11.5386728, 12.01214112, 12.13307653]
[12.01214112, 12.13307653]
Γενικά το μήκος του παραθύρου μπορεί να είναι διαφορετικό από το 2.
Πώς μπορείτε να το κάνετε αυτό; 
Νομίζω ότι εννοούσατε αύξηση με βάση το "Για κάθε παράθυρο μήκους 2 δευτερολέπτων ξεκινώντας από ένα δεύτερο όριο" και όχι επικάλυψη. Για διαστήματα δύο δευτερολέπτων, είναι το ίδιο, αλλά επειδή θέλετε να αλλάξετε το μήκος, η επικάλυψη ενός δευτερολέπτου θα είναι 0-3, 2-5, 4-7, αλλά η αύξηση σημαίνει 0-3, 1-4, 2- 5. Ωστόσο, ήταν ενδιαφέρον να βρούμε λύσεις και για τα δύο για κάθε περίπτωση.
Υποθέτοντας ότι το L ταξινομείται και όλα τα στοιχεία είναι θετικά και τα δεύτερα διαστήματα ξεκινούν με ακέραιους αριθμούς, μπορούμε να χρησιμοποιήσουμε αυτήν τη μέθοδο:
εισαγωγή μαθηματικών
από συλλογές εισαγωγής defaultdict
L = [0.10218048, 1.20851996, 1.46800021, 1.73429061, 2.71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8,83068894, 10,07690977, 11,53867284, 12,01214112, 12,133,7653
my_ranges = defaultdict (λίστα)
interval_width = 2
για x σε L:
upper_bound = math.ceil (x)
lower_bound = upper_bound - interval_width
lower_bound = max (0, lower_bound)
για y σε εύρος (κατώτερο_δεσμευμένο, άνω_δεσμευμένο):
my_ranges [y]. προσθήκη (x)
για ένα σε ταξινομημένο (my_ranges):
εκτύπωση (my_ranges [a])
Δεν ξέρω αν θέλετε να δείτε αν υπάρχουν κενά εύρη. Αλλά το defaultdict εκτυπώνει κενά εύρη, αν θέλετε, επίσης. Χρησιμοποιήστε αυτήν τη γραμμή αντί για "για ένα σε ταξινόμηση":
για εύρος τιμών (min (my_ranges), max (my_ranges) + 1):
Εάν θέλετε τα εύρη 0-3, 2-5, 4-7, αυτό λειτουργεί:
εισαγωγή μαθηματικών
από συλλογές εισαγωγής defaultdict
L = [0.10218048, 1.20851996, 1.46800021, 1.73429061, 2.71525848,
3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013,
6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247,
8,83068894, 10,07690977, 11,53867284, 12,01214112, 12,133,7653
interval_width = 2
my_ranges_2 = defaultdict (λίστα)
για x σε L:
σίγουρα_in = (x // (interval_width - 1)) * (interval_width - 1) # το χαμηλότερο πολλαπλάσιο του διαστήματος_ εύρος κάτω από το x θα είναι πάντα σε
#print ("Προσθήκη", x, "to", σίγουρα_in)
my_ranges_2 [σίγουρα_in]. προσθήκη (x)
αν x <σίγουρα_in + 1 και σίγουρα_in - interval_width> = 0: # για παράδειγμα, αν x είναι 2,3 και έχουμε 0,3 2,5 κ.λπ. ... πρέπει να πιάσουμε αυτήν την διπλή περίπτωση. Υποθέτω ότι τα μήκη των παραθύρων είναι ακέραιοι, και αν όχι, έχουμε πολλά να κάνουμε, επειδή ο αριθμός μπορεί να είναι σε περισσότερες από μία συστοιχίες. Ίσως θα μπορούσαμε να έχουμε λίγο βρόχο, να αυξάνεται κατά (interval_width - 1)
#print ("++ Προσθήκη", x, "to", σίγουρα_in - interval_width + 1)
my_ranges_2 [σίγουρα_in - interval_width + 1]. προσθήκη (x)
για ένα σε ταξινομημένο (my_ranges_2):
εκτύπωση (a, my_ranges_2 [a])
# εκτύπωση (my_ranges_2 [a])
Υποψιάζομαι ότι υπάρχουν κάποιες λεπτομέρειες που έχω ξεχάσει, αλλά ελπίζουμε ότι μπορείτε να στριφογυρίσετε το interval_width, όπως απαιτείται, για να βεβαιωθείτε ότι ο κώδικάς μου κάνει αυτό που ελπίζατε και με ενημερώστε τι ακριβώς χρειάζεστε.
|
Μια πιθανή λύση που μπορώ να προτείνω είναι "αποτελεσματική" κατά μία έννοια, ότι επαναλαμβάνει μόνο μία φορά μέσω των δεδομένων εισόδου και δεν έχει εξαρτήσεις. Το κόστος, φυσικά, είναι ότι είναι γραμμένο σε καθαρό πύθωνα (μπορεί να υπάρχει πιο βελτιστοποιημένος κώδικας) και ότι εισάγει περισσότερες μεταβλητές παρακολούθησης για να αποτρέψει την επανάληψη (και επομένως είναι λιγότερο πυθικός).
def sliding_window (δεδομένα, διάρκεια, έναρξη = 0, επικάλυψη = 1):
αποτέλεσμα = []
data_idx = 0
result_idx = 0
άνω = έναρξη + διάρκεια
χαμηλότερο = έναρξη
next_lower = άνω - επικάλυψη
# εσωτερικός βοηθός για την πλήρωση κενών εσωτερικών λιστών μέχρι το σημείο εισαγωγής και εισαγωγή
def pad_and_append (στις):
ενώ το len (αποτέλεσμα) <= στο:
αποτέλεσμα. προσάρτηση ([])
αποτέλεσμα [at] .append (data [data_idx])
# iterate μέσω δεδομένων εισόδου
ενώ data_idx  a:
αν x  = l [0]) & (L  = i) & (L